From 65493f8eb8b7792d22f349dd4771a1f853da829f Mon Sep 17 00:00:00 2001 From: =?utf8?q?=C3=98yvind=20Kol=C3=A5s?= Date: Wed, 13 Sep 2017 22:08:27 +0200 Subject: [PATCH] babl: abstract out TRC gamma detectors --- babl/babl-trc.c | 83 +++++++++++++++++-------------------------------- 1 file changed, 29 insertions(+), 54 deletions(-) diff --git a/babl/babl-trc.c b/babl/babl-trc.c index 4a05011..7d9f82f 100644 --- a/babl/babl-trc.c +++ b/babl/babl-trc.c @@ -474,81 +474,51 @@ float babl_trc_to_linear (const Babl *trc_, float value) } #endif -const Babl *babl_trc_lut_find (float *lut, int lut_size) +static int +babl_lut_match_gamma (float *lut, int lut_size, float gamma) { - int i; int match = 1; - - /* look for linear match */ - for (i = 0; match && i < lut_size; i++) - if (fabs (lut[i] - i / (lut_size-1.0)) > 0.015) - match = 0; - if (match) - return babl_trc_gamma (1.0); - - /* look for 2.2 match: */ - match = 1; + int i; if (lut_size > 1024) - { - for (i = 0; match && i < lut_size; i++) - { -#if 0 - fprintf (stderr, "%i %f %f\n", i, - lut[i], - pow ((i / (lut_size-1.0)), 2.2)); -#endif - if (fabs (lut[i] - pow ((i / (lut_size-1.0)), 2.2)) > 0.0001) - match = 0; - } - } - else { for (i = 0; match && i < lut_size; i++) { - if (fabs (lut[i] - pow ((i / (lut_size-1.0)), 2.2)) > 0.001) + if (fabs (lut[i] - pow ((i / (lut_size-1.0)), gamma)) > 0.0001) match = 0; } } - if (match) - return babl_trc_gamma(2.2); - - - /* look for 1.8 match: */ - match = 1; - if (lut_size > 1024) - { - for (i = 0; match && i < lut_size; i++) - { -#if 0 - fprintf (stderr, "%i %f %f\n", i, - lut[i], - pow ((i / (lut_size-1.0)), 1.8)); -#endif - if (fabs (lut[i] - pow ((i / (lut_size-1.0)), 1.8)) > 0.0001) - match = 0; - } - } else { for (i = 0; match && i < lut_size; i++) { - if (fabs (lut[i] - pow ((i / (lut_size-1.0)), 1.8)) > 0.001) + if (fabs (lut[i] - pow ((i / (lut_size-1.0)), gamma)) > 0.001) match = 0; } } - if (match) - return babl_trc_gamma(2.2); + return match; +} +const Babl *babl_trc_lut_find (float *lut, int lut_size) +{ + int i; + int match = 1; + + /* look for linear match */ + for (i = 0; match && i < lut_size; i++) + if (fabs (lut[i] - i / (lut_size-1.0)) > 0.015) + match = 0; + if (match) + return babl_trc_gamma (1.0); /* look for sRGB match: */ match = 1; if (lut_size > 1024) { - for (i = 0; match && i < lut_size; i++) - { - if (fabs (lut[i] - gamma_2_2_to_linear (i / (lut_size-1.0))) > 0.0001) - match = 0; - } + for (i = 0; match && i < lut_size; i++) + { + if (fabs (lut[i] - gamma_2_2_to_linear (i / (lut_size-1.0))) > 0.0001) + match = 0; + } } else { @@ -561,6 +531,11 @@ const Babl *babl_trc_lut_find (float *lut, int lut_size) if (match) return babl_trc ("sRGB"); + if (babl_lut_match_gamma (lut, lut_size, 2.2)) + return babl_trc_gamma(2.2); + + if (babl_lut_match_gamma (lut, lut_size, 1.8)) + return babl_trc_gamma(1.8); + return NULL; } - -- 2.30.2